#!/usr/bin/env python

import re
import string
import os
import time


def BHTC2CustData(LotPath,DeviceName,TestItemNum,TesterName,ProgramName,Version,LotWaferID,Patch,SortType,OperatorID,ChannelMap,StartTime,BinDefineDir,TempBHTC,TestItemNames):
    """Convert BHTC data format to Customer Data format"""
    
    DictBinDefineSigns={}
    DictBinDefineNames={}
    DictTotalBins={}
    DictPercents={}
    
     
    
    BinDefineFile="".join((BinDefineDir ,"/" ,"bin_def_" , DeviceName ,".h" ))   
    BinDefineFileFH = open(BinDefineFile,"r")
    
    #mytime=time.ctime()
    #print mytime
    
    Lines=BinDefineFileFH.readlines()
    for Line in Lines:
        if re.search("\s+\d+\s+[\w|+]\s+\w+",Line):
            TempArray=re.split("\s+",Line)
                       
            DictBinDefineSigns[int(TempArray[1])]=TempArray[2]
            DictBinDefineNames[int(TempArray[1])]=TempArray[3]
            DictTotalBins[int(TempArray[1])]=0
            DictPercents[int(TempArray[1])]=0
            
    
    BinDefineNum=len(DictBinDefineNames)            
    BinDefineFileFH.close                
    
    ###################################################
    #Ready for print bhtc and wafermap
    ###################################################
    BHTCDir=os.path.join(LotPath,"Bhtc")
    MapDir=os.path.join(LotPath,"Map")
    InkMapDir=os.path.join(LotPath,"Inkmap")
    SnDir=os.path.join(LotPath,"Sn")
    MapHHDir=os.path.join(LotPath,"Maphh")
    
    if not os.path.isdir(BHTCDir):
        os.mkdir(BHTCDir)
        
    if not os.path.isdir(MapDir):
        os.mkdir(MapDir)
        
    if re.search("Sort2",SortType,re.I):
        if not os.path.isdir(InkMapDir):
            os.mkdir(InkMapDir)
            
        if not os.path.isdir(SnDir):
            os.mkdir(SnDir)
    
    #if not os.path.isdir(MapHHDir):
    #    os.makdir(MapHHDir)
        
    TempArray=re.split("-",LotWaferID)
    WaferID=TempArray[1]
    
    if (int(WaferID) <10) and  (not re.search("0",WaferID)):
        WaferID="".join(("0",WaferID))
        
    #TempArray=re.split("_",LotNum)
    InkMapFileName="".join((TempArray[0],WaferID))
    #SnFileName=InkMapFileName
    LotNum=os.path.basename(LotPath)
    TempFileName="".join((DeviceName,"_",LotNum,"_",Version,"_",Patch,"_",SortType,"_",WaferID))
    BHTCFile="".join((BHTCDir,"/",TempFileName,".bhtc"))
    MapFile="".join((MapDir,"/",TempFileName,".map"))
    InkMapFile="".join((InkMapDir,"/",InkMapFileName,".map"))
    SnFile="".join((SnDir,"/",TempFileName,".sn"))
    #MapHHFile="".join((MapHHDir,"/",TempFileName,".maphh"))
    
    
    
    TempBHTCFileFH=open(TempBHTC,"r")
    
    BHTCOutFileFH=open(BHTCFile,"w")
    BHTCOutFileFH.write("Device    Name : %s\n" % DeviceName)
    BHTCOutFileFH.write("Tester    Name : %s\n" % TesterName)
    BHTCOutFileFH.write("Program   Name : %s\n" % ProgramName)
    BHTCOutFileFH.write("ProgramVersion : %s\n" % Version)
    BHTCOutFileFH.write("Lot        Num : %s\n" % LotNum)
    BHTCOutFileFH.write("Wafer       ID : %s\n" % LotWaferID)
    BHTCOutFileFH.write("Wafer    Patch : %s\n" % Patch)
    BHTCOutFileFH.write("Sort        ID : %s\n" % SortType)
    BHTCOutFileFH.write("Operator    ID : %s\n" % OperatorID)
    BHTCOutFileFH.write("Channel    Map : %s\n" % ChannelMap)
    BHTCOutFileFH.write("Start     Time : %s\n" % StartTime)
    BHTCOutFileFH.write("Unify unit: voltage <mV> current <uA>\n\n")
    BHTCOutFileFH.write("%s%s%s" % ("Times |Bin |  X|  Y| Site|         IDStrings           |",TestItemNames,"\n"))
    
    #MapHHFileFH=open(MapHHFile,"w")
    #MapHHFileFH.write("Device    Name : %s\n" % DeviceName)
    #MapHHFileFH.write("Tester    Name : %s\n" % TesterName)
    #MapHHFileFH.write("Program   Name : %s\n" % ProgramName)
    #MapHHFileFH.write("ProgramVersion : %s\n" % Version)
    #MapHHFileFH.write("Lot        Num : %s\n" % LotNum)
    #MapHHFileFH.write("Wafer       ID : %s\n" % LotWaferID)
    #MapHHFileFH.write("Wafer    Patch : %s\n" % Patch)
    #MapHHFileFH.write("Sort        ID : %s\n" % SortType)
    #MapHHFileFH.write("Operator    ID : %s\n" % OperatorID)
    #MapHHFileFH.write("Channel    Map : %s\n" % ChannelMap)
    #MapHHFileFH.write("Start     Time : %s\n" % StartTime)
    #MapHHFileFH.write("Unify unit: voltage <mV> current <uA>\n\n")
    #MapHHFileFH.write("Times |Bin  |  X|  Y|  Site|         IDStrings           | Title\n")
    
    if re.search("Sort2",SortType,re.I):
        InkMapFileFH=open(InkMapFile,"w")
        InkMapFileFH.write("=r %s\n" % str(Patch))
        SnFileFH=open(SnFile,"w")
        
    MapFileFH =open (MapFile,"w")
    MapFileFH.write("       -------wafer map of devicename:")
    MapFileFH.write(BHTCFile),
    MapFileFH.write("-------\n\nStart date :"),
    MapFileFH.write(StartTime),
    MapFileFH.write("\n\n\n")
    
    CompiledExpressBHTC=re.compile("\s+\d+\s+\|\s+\d+\s+\|")
    CompiledExpressSplit=re.compile("\|")
    #Lines=TempBHTCFileFH.readlines()
    
    CoordX=""
    CoordY=""
    Times={}
    Bins={}
    Sns={}
    Sites={}
    TestValues={}
    TotalDevices=0
    #Percent=[]
    PassPercent=0
    FlagStartX=10000
    FlagStartY=10000
    FlagEndX=-10000
    FlagEndY=-10000
    
            
    #for Line in Lines:
    while True:
        Line=TempBHTCFileFH.readline()
        if len(Line)==0:
            break
        
        
        if CompiledExpressBHTC.search(Line):
            TempArray=CompiledExpressSplit.split(Line)
            TempArray[1]=int(TempArray[1])
            TempArray[2]=int(TempArray[2])
            TempArray[3]=int(TempArray[3])
            
            if FlagStartX > TempArray[2]:
                FlagStartX = TempArray[2]
                
            if FlagEndX < TempArray[2]:
                FlagEndX = TempArray[2]
                
            if FlagStartY > TempArray[3]:
                FlagStartY = TempArray[3]
            
            if FlagEndY < TempArray[3]:
                FlagEndY = TempArray[3]
            
            #TempArray[2]=TempArray[2].lstrip()
            #TempArray[2]=TempArray[2].rstrip()
            #TempArray[3]=TempArray[3].lstrip()
            #TempArray[3]=TempArray[3].rstrip()
            
            TempKey="".join(("X",str(TempArray[2]),"Y",str(TempArray[3])))
            
            if Times.has_key(TempKey):
                Times[TempKey]=int(Times[TempKey])+int(TempArray[0])
            else:
                Times[TempKey]=int(TempArray[0])
            Bins[TempKey]=int(TempArray[1])
            Sites[TempKey]=TempArray[4]
            Sns[TempKey]=TempArray[5]
            
            #TempArray[2]=TempArray[2]+100
            #TempArray[3]=TempArray[3]+100
            
            
            #Times[TempArray[2]][TempArray[3]] = Times[TempArray[2]][TempArray[3]] + TempArray[0]
            #Bins[TempArray[2]][TempArray[3]] = TemArray[1]
            #Sites[TempArray[2]][TempArray[3]] = TempArray[4]
            #Sns[TempArray[2]][TempArray[3]] = TempArray[5]
            
            for Index in range(int(TestItemNum)):
                TempTestValuesKey="".join((TempKey,"Z",str(Index)))
                TestValues[TempTestValuesKey] = TempArray[Index+6]
                
            
    ###############################################################
    #Print Out Customer data
    ##############################################################
    
    TempStartX = FlagStartX - 7
    TempEndX = FlagEndX + 5
    
    CompStartX = TempStartX % 10
    CompEndX = TempEndX % 10
    
    IntStartX = int(TempStartX /10)
    IntEndX = int(TempEndX /10)
    
    AbsCompStartX = abs(TempStartX) % 10
    AbsCompEndX = abs(TempEndX) %10
    
    AbsIntStartX = abs(int(TempStartX/10))
    AbsIntEndX = abs(int(TempStartX/10))
                     
    ############################################################################################
    ############################################################################################
    ##  Start of Print Map Head                                                               ##
    ##                                                                                        ##
    ############################################################################################
    ############################################################################################
    
    ################################################################
    #print first line of Map Head 
    ################################################################
    
    MapFileFH.write("%2s" % " ")
    for Index in range(TempEndX,TempStartX,-1):
        if Index < 0 :
            MapFileFH.write("%2s" % "-")
        else:
            MapFileFH.write("%2s" % " ")
            
    MapFileFH.write("\n")
    
    ################################################################
    #print Second line of Map Head 
    ################################################################
    MapFileFH.write("%2s" % " ")
    for Index in range(TempEndX,TempStartX-1,-1):
        MapFileFH.write("%2s" % 0)
        
    MapFileFH.write("\n")
    
    ###############################################################
    #print third line of Map Head
    ###############################################################
    MapFileFH.write("%2s" % " ")
    for Index in range(AbsCompEndX,-1,-1):
        MapFileFH.write("%2s" % AbsIntEndX)
        
    for Index1 in range(IntEndX-1,IntStartX,-1):
        if Index1 == 0:
            for Index2 in range(19):
                MapFileFH.write("%2s" % 0)
        else:
            for Index3 in range(10):
                AbsIndex1=abs(Index1)
                MapFileFH.write("%2s" % AbsIndex1)
                
    for Index in range(AbsCompStartX,-1,-1):
        MapFileFH.write("%2s" % AbsIntStartX)
        
    MapFileFH.write("\n")
    
    #######################################################
    #Print fourth line of Map Head
    ######################################################
    MapFileFH.write("%2s" % " ")
    for Index in range(AbsCompEndX,-1,-1):
        MapFileFH.write("%2s" % Index)
        
    for Index1 in range(IntEndX-1,IntStartX,-1):
        if Index1 <0 :
            for Index2 in range(10):
                MapFileFH.write("%2s" % Index2)
        elif Index1 == 0:
            for Index3 in range(-9,10,1):
                AbsIndex3 = abs(Index3)
                MapFileFH.write("%2s" % AbsIndex3)
        else:
            for Index4 in range(9,-1,-1):
                MapFileFH.write("%2s" % Index4)
                
    for Index in range(AbsCompStartX+1):
        MapFileFH.write("%2s" % Index)
        
    MapFileFH.write("\n")
    ##############################################################
    #Print fifth line of Map Head
    #############################################################
    MapFileFH.write("%2s" % " ")
    for Index in range(TempEndX,TempStartX-1,-1):
        if not abs(Index %10):
            MapFileFH.write("%2s" % ".")
        else:
            MapFileFH.write("%2s" % " ")
            
    MapFileFH.write("\n")
    
    ############################################################################################
    ############################################################################################
    ##  End of Print Map Head                                                                 ##
    ##                                                                                        ##
    ############################################################################################
    ############################################################################################
    
    
    ##########################################################################
    #print wafermap
    #########################################################################
    
    TempIndex1=""
    TempIndex2=""
    TotalBin=[]
    
    #mytime=time.ctime()
    #print mytime
    
    for Index2 in range(FlagStartY,FlagEndY+1,1):
        IntIndex2=int(Index2)
        MapFileFH.write("%2s" % IntIndex2)
        for Index1 in range(TempEndX,TempStartX,-1):
            IntIndex1=int(Index1)
            #TempIndex1=Index1+100
            #TempIndex2=Index2+100
            TempKey="".join(("X",str(Index1),"Y",str(Index2)))            
            if Bins.has_key(TempKey):
            #if Bins[TempKey]:
                BHTCOutFileFH.write("%6s%s%4s%s%3s%s%3s%s%4s%s%26s%s" % (Times[TempKey],"|",Bins[TempKey],"|",Index1,"|",Index2,"|",Sites[TempKey],"|",Sns[TempKey],"|"))
                if re.search("Sort2",SortType,re.I):                    
                    SnFileFH.write("%3d%s%3d%s%24s%s" % (Index1,"|",Index2,"|",Sns[TempKey],"|"))
                if Bins[TempKey]:
                    for Index4 in range(BinDefineNum):
                        if Bins[TempKey] == Index4:
                            DictTotalBins[Index4]=DictTotalBins[Index4]+1
                if Bins[TempKey] == 1:
                    MapFileFH.write("%2s" % "+")
                    if re.search("Sort2",SortType,re.I):
                        InkMapFileFH.write("A")
                else:
                    MapFileFH.write("%2s" % DictBinDefineSigns[Bins[TempKey]])
                    if re.search("Sort2",SortType,re.I):
                        InkMapFileFH.write("Z")
                                        
                for Index3 in range(int(TestItemNum)):
                    TempTestValueKey="".join((TempKey,"Z",str(Index3)))
                    if re.search("<F>",TestValues[TempTestValueKey]):
                        TempArrayTestValues=re.split("<F>",TestValues[TempTestValueKey])
                        BHTCOutFileFH.write("%11.4f%3s%s" % (float(TempArrayTestValues[0]),"<F>",r"|"))
                    elif  re.search("[\*+|PASS|FAIL]",TestValues[TempTestValueKey]):
                        BHTCOutFileFH.write("%14s%s" % (TestValues[TempTestValueKey],r"|"))
                    else:
                        BHTCOutFileFH.write("%14.4f%s" % (float(TestValues[TempTestValueKey]),r"|"))
                BHTCOutFileFH.write("\n")
                if re.search("Sort2",SortType,re.I):
                    SnFileFH.write("\n")
                
            else:
                if re.search("Sort2",SortType,re.I):
                    InkMapFileFH.write(".")
                if (not abs(Index1 %10 )) or (not abs(Index2 % 10)):
                    MapFileFH.write("%2s" % ".")
                else:
                    MapFileFH.write("%2s" % " ")
                    
        MapFileFH.write("%2s" % IntIndex2)
        MapFileFH.write("\n")
        
        if re.search("Sort2",SortType,re.I):
            InkMapFileFH.write("\n")
    ############################################################################################
    ############################################################################################
    ##  Start of Print Map Trail                                                              ##
    ##                                                                                        ##
    ############################################################################################
    ############################################################################################
    
    ##############################################################
    #Print first line of Map Trail
    #############################################################
    MapFileFH.write("%2s" % " ")
    for Index in range(TempEndX,TempStartX-1,-1):
        if not abs(Index %10):
            MapFileFH.write("%2s" % ".")
        else:
            MapFileFH.write("%2s" % " ")
    MapFileFH.write("\n")
    ################################################################
    #print second line of Map Trail 
    ################################################################
    MapFileFH.write("%2s" % " ")
    for Index in range(TempEndX,TempStartX-1,-1):
        if (Index <0 ):
            MapFileFH.write("%2s" % "-")
        else:
            MapFileFH.write("%2s" % " ")
    MapFileFH.write("\n")
    ################################################################
    #print third line of Map Trail
    ################################################################
    MapFileFH.write("%2s" % " ")
    for Index in range(TempEndX,TempStartX-1,-1):
        MapFileFH.write("%2s" % 0)
    MapFileFH.write("\n")
    
    ###############################################################
    #print fourth line of Map Trail
    ###############################################################
    MapFileFH.write("%2s" % " ")
    for Index in range(AbsCompEndX,-1,-1):
        MapFileFH.write("%2s" % AbsIntEndX)
    for Index1 in range(IntEndX-1,IntStartX,-1):
        if Index1 ==0:
            for Index2 in range(19):
                MapFileFH.write("%2s" % 0)
        else:
            for Index3 in range(10):
                AbsIndex1=abs(Index1)
                MapFileFH.write("%2s" % AbsIndex1)
    for Index in range(AbsCompStartX,-1,-1):
        MapFileFH.write("%2s" % AbsIntStartX)
    MapFileFH.write("\n")    
    #######################################################
    #Print fifth line of Map Trail
    ######################################################
    MapFileFH.write("%2s" % " ")
    for Index in range(AbsCompEndX,-1,-1):
        MapFileFH.write("%2s" % Index)
    for Index1 in range(IntEndX-1,IntStartX,-1):
        if Index1<0:
            for Index2 in range(10):
                MapFileFH.write("%2s" % Index2)
        elif Index1 ==0 :
            for Index3 in range(-9,10,1):
                AbsIndex3=abs(Index3)
                MapFileFH.write("%2s" % AbsIndex3)
        else:
            for Index4 in range(9,-1,-1):
                MapFileFH.write("%2s"%Index4)
    for Index in range(AbsCompStartX+1):
        MapFileFH.write("%2s" % Index)
        
    MapFileFH.write("\n")
    ############################################################################################
    ############################################################################################
    ##  End of Print Map Trail                                                                ##
    ##                                                                                        ##
    ############################################################################################
    ############################################################################################
    
    ###################################################################
    #Statistical every bin
    ###################################################################
    TotalDevice=0
    #BinsKeys=
    for Key in DictTotalBins.keys():
        TotalDevice=TotalDevice+DictTotalBins[Key]
    
    for Key in DictTotalBins.keys():
        if TotalDevice <=0:
            TotalDevice =1
        
        DictPercents[Key]=float(DictTotalBins[Key])/TotalDevice *100
        
    MapFileFH.write("%5s%5s%10s%15s%28s\n" % ("Bin","sys","Num","Percent","Note"))
    MapFileFH.write("------------------------------------------------------------------------\n")
    for Key in DictTotalBins.keys():
        if(DictTotalBins[Key]):
            MapFileFH.write("%5d%5s%10d%13.2f%s%38s\n" % (Key,DictBinDefineSigns[Key],DictTotalBins[Key],DictPercents[Key],"%",DictBinDefineNames[Key]))
    MapFileFH.write("------------------------------------------------------------------------\n")                
    MapFileFH.write("%s %d %s"% ("Total number of devices binned = ",TotalDevice,"\n"))                
    
    TempBHTCFileFH.close
    BHTCOutFileFH.close
    MapFileFH.close
    if re.search("Sort2",SortType,re.I):
        SnFileFH.close
    
    return(0)


def main():    
     #BHTC2CustData(LotPath,DeviceName,TestItemNum,TesterName,ProgramName,Version,LotWaferID,Patch,SortType,OperatorID,ChannelMap,StartTime,BinDefineDir,TempBHTC,Title)
     BHTC2CustData("f:/GUI","hed0409",50,"Ruby","HED0409_V65_SORT2.XLS","V65","h615480-1","90","Sort2","Wangz","Channel_4Site","20/Aprl 2006","f:\GUI\parameter",r"f:\GUI\bhtc.bhtc","cont_gnd_mrst|cont_gnd_mclk|cont_gnd_tp1|cont_gnd_tp2|cont_gnd_AIT|cont_gnd_vppl|cont_gnd_IO1|cont_gnd_IO2|cont_gnd_vpph|cont_vdd_mrst|cont_vdd_mclk|cont_vdd_tp1|cont_vdd_tp2|cont_vdd_AIT|cont_vdd_IO1|cont_vdd_IO2|Idd_rst0_VDD|lil_TP_Ait_tp2|lil_TP_Ait_tp1|lil_TP_Ait_AIT|lil_Rst_Clk_mclk|lil_Rst_Clk_mrst|lil_io1_io2_IO2|lil_io1_io2_IO1||lih_TP_Ait_tp2|lih_TP_Ait_tp1|lih_TP_Ait_AIT|lih_Rst_Clk_mclk|lih_Rst_Clk_mrst|lih_io1_io2_IO2|lih_io1_io2_IO1|Sort2a|RFP|Sort2b|Idd_normal|Idd_normal_VDD|Idd_normal|RFP|Sort2b|SN_HED0409|AI_INI|AI_TEST_MODE|Ai_far_function_R2C_L1|Ai_far_function_C2R_L1|Ai_near_function_R2C_L1|Ai_near_function_C2R_L1|Ai_far_function_R2C_L2|Ai_far_function_C2R_L2|Ai_near_function_R2C_L2|Ai_near_function_C2R_L2")
  

if __name__ == '__main__':
    main()
                    